#include <stdio.h>
#include <stdlib.h>
#include "list.h"  //双向循环链表

//自定义的类型
struct student {
    int sno;
    struct list_head list; //节点类型
};


int main(void)
{
    int i;
    struct student *p;
    struct student head; //头节点
    struct list_head *pos; //保存遍历链表节点的指针
    //初始化内核链表
    INIT_LIST_HEAD(&head.list); //内核链表头节点的指针

    for (i = 0; i < 5; i++) {
        p = (struct student *)malloc(sizeof(struct student));
        p->sno = i *10;
        list_add(&p->list, &head.list); //头节点后面插入
    }
    printf("head");
    list_for_each(pos, &head.list) {   
        // pos: 保存遍历链表节点的指针   类型:struct list_head*    
        // &head.list: 内核链表头节点的地址 类型:struct list_head*
        /**
         *  这里通过结构体属性反推拿到结构体
         *    通过pos(struct list_head) 得到struct student
         */
        p = list_entry(pos, struct student, list); //通过小结构pos指针找到大结构体的指针    
        //pos小结构体指针, 大结构体类型名, 小结构体在大结构体的成员名list
        
        printf("<->%d", p->sno);

    }
    printf("<->head\n");
}




